"""
    不规则三角形网（TIN）是载体表面的点数据集内相互连接的点组成的三角面的向量表示。
和栅格数据不同之处在于，算法决定了哪些是用于精确表示地形必不可少的点，根据给定区域
存储一定数量的单元并且将相邻单元格的重复高程值更加高效地存储为一个多边形。

    注意：该脚本需要若干分钟才能执行完！！！！
"""

from laspy.file import File
import voronoi
import pickle
import os
import time
import math
import numpy
import shapefile


sourec = "Grid/lidar/clippedLAS.las"
output = "Grid/lidar/mesh"
# 三角形数据文件归档
archive = "Grid/lidar/triangles.p"
# Pyshp文件归档
pyshp = "Grid/lidar/mesh_pyshp.p"

class Point:
    """ Point 类需要调用的voronoi模块"""
    def __init__(self, x, y):
        self.px = x
        self.py = y
    def x(self):
        return self.px
    def y(self):
        return self.py

# 三角形数组保存的三点索引元组用于点集查询
# voronoi 模块载入归档文件创建三角面
triangles = None
if os.path.exists(archive):  # 如果path存在，返回True；如果path不存在，返回False
    print("Loading trangle archive...")
    f = open(archive, "rb")
    triangles = pickle.load(f)
    f.close()
    # 打开LIDAR的LAS文件
    las = File(sourec, mode="r")
else:
    # 打开LIDAR的LAS文件
    las = File(sourec, mode="r")
    points = []
    print("Assembling points...")
    # 从LAS文件中读取点集
    for x, y in numpy.nditer((las.x, las.y)):
        points.append(Point(x, y))
    print("Composing triangles...")
    # Delaunay 三角剖分
    triangles = voronoi.computeDelaunayTriangulation(points)